| ![]() |
Resumable upload interfaces provides reliable mechanism of uploading large files to WebDAV server and managing long-lasting uploads. After implementing resumable upload feature you will be able to pause \ resume uploads, restore broken uploads, report upload progress and create upload progress bars.
To handle upload in your server implementation you must implement IResumableUpload and IUploadProgress interfaces on a resource items. IResumableUpload provides its own SaveFromStream method that will be always called instead of IResource.SaveFromStream. Here is the example of IResumableUpload.SaveFromStream method implementation:
public WebDAVResponse SaveFromStream(long startIndex, long totalContentLength, Stream segment, string contentType)
{
long segmentSize = 0;
try
{
segmentSize = SaveContent(segment, contentType, totalContentLength, startIndex); // save segment and totalContentLength
}
catch (HttpListenerException)
{
// connection broken or closed by client
}
if (startIndex + segmentSize < totalContentLength)
{
return new ResumeIncompleteResponse(); // more segments expected
}
else if (segmentSize > 0)
{
return new OkResponse(); // all segments received
}
else
{
return new NoContentResponse(); // content truncated to zero
}
}
In this method you will save segments of file content in your persistent storage. The engine passes 2 additional parameters to this method - index in file to which corresponds first byte in content parameter and total size of the resource being uploaded. You will also save totalContentLength in your persistent storage. You will later return value of this parameter from IResumableUpload.TotalContentLength property implementation.
From your IResumableUpload.SaveFromStream implementation you will return ResumeIncompleteResponse in case when more segments are expected to arrive.
Note that if you implement IResumableUpload, IFolder.CreateResource method will always receive null stream and content will be always passed to IResumableUpload.SaveFromStream method.
From your IUploadProgress.UploadProgress implementation on resource items you will return array with only 1 item - this resource:
IResumableUpload[] IUploadProgress.UploadProgress
{
get
{
IResumableUpload[] items = new IResumableUpload[1];
items[0] = this;
return items;
}
}
For each item from the array the engine will request Path, LastChunkSaved, BytesUploaded, TotalContentLength and submit this info to client application.
Optionally you can implement IUploadProgress interface on folder items. In this case you will return array of items that are being uploaded to server. Here is the typical class diagram in this case: